@echo off

rem  Inno Setup
rem  Copyright (C) 1997-2025 Jordan Russell
rem  Portions by Martijn Laan
rem  For conditions of distribution and use, see LICENSE.TXT.
rem
rem  Batch file to prepare a release
rem
rem  Calls setup-sign.bat if it exists to create a signed build, otherwise creates setup.exe without signing
rem  Signed builds also require a setup-presign.bat to exist which should sign all files passed to it
rem
rem  This batch files does the following things:
rem  -Ask the user to compile Inno Setup including ISSigTool and ISHelpGen after clearing output first
rem  -Compile ISetup*.chm
rem  -Create Inno Setup installer
rem
rem  Once done the installer can be found in Output

setlocal

set VER=6.7.0-dev

echo Building Inno Setup %VER%...
echo.

cd /d %~dp0

if "%1"=="setup" goto setup
if not "%1"=="" goto failed

if not exist files\issigtool.exe (
  echo Missing ISSigTool
  echo Now open Projects\Projects.groupproj and build the ISSigTool project and its Win32 target in Release mode

  echo - Waiting for file...
  call :waitforfile files\issigtool.exe
  echo Compiling ISSigTool done
)

rem  Verify precompiled binaries which are used during compilation
rem  Note: Other precompiled binaries are verified by Setup.iss
call .\issig.bat verify --key-file=def01.ispublickey ^
  Projects\Src\Setup.HelperEXEs.res ^
  Projects\Src\Compression.LZMADecompressor\Lzma2Decode\ISLzmaDec.obj ^
  Projects\Src\Compression.LZMA1SmallDecompressor\LzmaDecode\LzmaDecodeInno.x86.obj ^
  Projects\Src\Compression.LZMA1SmallDecompressor\LzmaDecode\LzmaDecodeInno.x64.obj ^
  Projects\Src\Compression.SevenZipDecoder\7zDecode\IS7zDec.obj
if errorlevel 1 goto failed
echo ISSigTool verify done

rem  Embed user's public key into sources
call .\issig.bat embed
if errorlevel 1 goto failed
echo ISSigTool embed done

echo.
call :deletefile files\compil32.exe
call :deletefile files\iscc.exe
call :deletefile files\iscmplr.dll
call :deletefile files\ispp.dll
call :deletefile files\setup.e32
call :deletefile files\setupcustomstyle.e32
call :deletefile files\setupldr.e32
call :deletefile files\setupldr.e64
call :deletefile files\issigtool.exe
call :deletefile ishelp\ishelpgen\ishelpgen.exe

echo Clearing compilation output done
echo Now open Projects\Projects.groupproj and build the Release build group
echo You can open the Build Groups pane from the Projects tool window

echo - Waiting for files...
call :waitforfile files\compil32.exe
call :waitforfile files\iscc.exe
call :waitforfile files\iscmplr.dll
call :waitforfile files\ispp.dll
call :waitforfile files\setup.e32
call :waitforfile files\setupcustomstyle.e32
call :waitforfile files\setupldr.e32
call :waitforfile files\setupldr.e64
call :waitforfile files\issigtool.exe
call :waitforfile ishelp\ishelpgen\ishelpgen.exe

echo Found all, waiting 2 seconds more...
timeout /t 2 /nobreak >nul
echo Compiling Inno Setup done

if exist .\setup-presign.bat (
  echo - Presigning
  call .\setup-presign.bat Files\ISCC.exe Files\ISCmplr.dll Files\ISPP.dll
  if errorlevel 1 goto failed
  echo Presign done
)

rem  Sign using user's private key - also see compile.bat
call .\issig.bat sign Files\ISCmplr.dll Files\ISPP.dll Files\Setup.e32 Files\SetupCustomStyle.e32 Files\SetupLdr.e32 Files\SetupLdr.e64
if errorlevel 1 goto failed
echo ISSigTool sign done
pause

cd ishelp
if errorlevel 1 goto failed
call .\compile.bat
if errorlevel 1 goto failed
cd ..
if errorlevel 1 goto failed
echo Compiling ISetup*.chm done
pause

:setup
echo - Setup.exe
if exist .\setup-sign.bat (
  call .\setup-sign.bat
) else (
  files\iscc setup.iss
)
if errorlevel 1 goto failed
echo - Renaming files
cd output
if errorlevel 1 goto failed
move /y mysetup.exe innosetup-%VER%.exe
if errorlevel 1 goto failed
cd ..
if errorlevel 1 goto failed
echo Creating Inno Setup installer done
call .\issig.bat sign output\innosetup-%VER%.exe
if errorlevel 1 goto failed
powershell.exe -NoProfile -Command "Write-Host -NoNewline 'SHA256 hash: '; (Get-FileHash -Algorithm SHA256 -Path output\innosetup-%VER%.exe).Hash.ToLower()"
rem ignoring error here

echo All done!
pause
exit /b 0

:failed
echo *** FAILED ***
pause
exit /b 1

:deletefile
if exist "%~1" (
    del "%~1"
    if exist "%~1" goto failed
    echo Cleared %~1
) 
exit /b

:waitforfile
if not exist "%~1" (
    timeout /t 1 /nobreak >nul
    goto waitforfile
)
echo Found %~1
exit /b
